package com.annotation;

/**
 * @功能：分析类初始化
 * @版本： V1
 * @版权： 信息技术有限公司（http://www.mychery.com/）
 * @作者： 磐石战队开发组  00355760
 * @日期： 2024/8/10 14:45
 */
public class demo07 {
    /**
     * 类的主动引用(一定会发生初始化)
     * 当虚拟机启动，先初始化main方法所在的类
     * new一个类的对象
     * 调用类的静态成员(除了final常量)和静态方法
     * 使用java,lang.reflect包的方法对类进行反射调用
     * 当初始化一个类，如果其父类未被初始化，则先会初始化其父类
     * 类的被动引用(不会发生类的初始化)
     * 当访问一个静态域时，只有真正声明这个域的类才会被初始化。如：当通过子类引用父类的静态变量，不会导致子类的初始化
     * 通过数组定义引用，不会出发此类的初始化
     * 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中)
     */
    static {
        System.out.println("Main类被加载");
    }
    public static void main(String[] args) throws ClassNotFoundException {
        //1.主动引用
        Son son = new Son();
        //反射也会产生主动引用
        Class.forName("cn.com.annotation.Son");
        //不会产生类的引用的方法
        //子类引用父类的值
        System.out.println(Son.n);
        //数组只是开辟一个内存空间，也不会初始化
        Son[] a = new Son[5];
        //引用常量也不会初始化
        System.out.println(Son.M);
    }

}

class Father {
    static int n = 2;
    static {
        System.out.println("父类被加载");
    }
}
class Son extends Father {
    static {
        System.out.println("子类被加载");
        m = 300;
    }
    static int m = 100;
    static final int M = 1;
}